let array = [1,2,3,4,5,6,7,8]  // 定义一个数组，之后所有方法都基于这个数组进行操作

// 1. push: 向数组末尾添加一个或多个元素，返回新数组的长度，会修改原数组
// 注意：push 会直接改变原数组
let pushResult = array.push(9, 10)
console.log('push 后 array:', array) // [1,2,3,4,5,6,7,8,9,10]
console.log('push 返回值:', pushResult) // 10

// 2. pop: 删除数组最后一个元素，返回被删除的元素，会修改原数组
// 注意：pop 只删除最后一个元素
let popResult = array.pop()
console.log('pop 后 array:', array) // [1,2,3,4,5,6,7,8,9]
console.log('pop 返回值:', popResult) // 10

// 3. shift: 删除数组第一个元素，返回被删除的元素，会修改原数组
// 注意：shift 只删除第一个元素
let shiftResult = array.shift()
console.log('shift 后 array:', array) // [2,3,4,5,6,7,8,9]
console.log('shift 返回值:', shiftResult) // 1

// 4. unshift: 向数组开头添加一个或多个元素，返回新数组的长度，会修改原数组
// 注意：unshift 会直接改变原数组
let unshiftResult = array.unshift(0, 1)
console.log('unshift 后 array:', array) // [0,1,2,3,4,5,6,7,8,9]
console.log('unshift 返回值:', unshiftResult) // 10

// 5. splice: 可以删除、替换、插入元素，返回被删除的元素数组，会修改原数组
// 语法：array.splice(起始索引, 删除个数, 插入元素1, 插入元素2, ...)
// 注意：splice 是最灵活的修改方法，可以同时做增删改
let spliceResult = array.splice(2, 3, 'a', 'b') // 从索引2开始，删除3个元素，插入'a','b'
console.log('splice 后 array:', array) // [0,1,'a','b',5,6,7,8,9]
console.log('splice 返回值:', spliceResult) // [2,3,4]

// 6. sort: 对数组元素进行排序，默认按字符串Unicode顺序排序，会修改原数组
// 注意：如果要按数字大小排序，需要传入比较函数，否则会出现 [1,10,2,3,...] 这种情况
array.sort((a, b) => {
    // 如果元素是数字或数字字符串，按从小到大排序
    if (typeof a === 'number' && typeof b === 'number') {
        return a - b
    }
    // 其他情况按字符串比较
    return String(a).localeCompare(String(b))
})
console.log('sort 后 array:', array)

// 7. reverse: 反转数组中元素的顺序，会修改原数组
let reverseResult = array.reverse()
console.log('reverse 后 array:', array)
console.log('reverse 返回值:', reverseResult) // reverse 返回原数组的引用

// 8. fill: 用静态值填充数组的全部或部分元素，会修改原数组
// 语法：array.fill(填充值, 起始索引, 结束索引(不包含))
// 注意：fill 会覆盖原有元素
let fillResult = array.fill('x', 2, 5) // 从索引2到索引5（不含5）填充为'x'
console.log('fill 后 array:', array)
console.log('fill 返回值:', fillResult) // fill 返回原数组的引用

// 9. copyWithin: 将数组指定位置的元素复制到其他位置，会修改原数组
// 语法：array.copyWithin(目标索引, 起始索引, 结束索引(不包含))
// 注意：copyWithin 会覆盖目标位置的元素，长度不变
let copyWithinResult = array.copyWithin(0, 5, 7) // 把索引5到6的元素复制到 索引0开始到拷贝数量 的位置
console.log('copyWithin 后 array:', array)
console.log('copyWithin 返回值:', copyWithinResult) // copyWithin 返回原数组的引用